import datetime
from flask import request, jsonify, g
from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt
from app.models import Admin, Permission, AdminLog
from app.core.extensions import db
from . import admin_blueprint


@admin_blueprint.route('/permissions', methods=['GET'])
@jwt_required()
def get_permissions():
    """获取权限列表"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    
    if not admin:
        return jsonify({'code': 1, 'message': '管理员不存在'}), 404
    
    permissions = Permission.query.all()
    
    result = []
    for perm in permissions:
        result.append(perm.to_dict())
    
    return jsonify({'code': 0, 'message': '获取成功', 'data': result})


@admin_blueprint.route('/menu-permissions', methods=['GET'])
@jwt_required()
def get_menu_permissions():
    """获取菜单权限列表"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    
    if not admin:
        return jsonify({'code': 1, 'message': '管理员不存在'}), 404
    
    permissions = Permission.query.filter_by(type='menu').all()
    
    result = []
    for perm in permissions:
        result.append(perm.to_dict())
    
    return jsonify({'code': 0, 'message': '获取成功', 'data': result})


@admin_blueprint.route('/route-permissions', methods=['GET'])
@jwt_required()
def get_route_permissions():
    """获取当前用户的路由权限"""
    current_user_id = get_jwt_identity()
    
    admin = Admin.query.get(current_user_id)
    if not admin:
        return jsonify({'code': 1, 'message': '管理员不存在'}), 404
    
    # 获取所有权限
    permissions = admin.get_permissions()
    
    return jsonify({
        'code': 0,
        'message': '获取成功',
        'data': permissions
    })


@admin_blueprint.route('/permissions', methods=['POST'])
@jwt_required()
def create_permission():
    """创建权限"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    claims = get_jwt()
    
    # 测试账号不能创建权限
    if claims.get('is_test'):
        return jsonify({'code': 1, 'message': '测试账号不能创建权限'}), 403
    
    # 只有超级管理员可以创建权限
    if not admin.is_super:
        return jsonify({'code': 1, 'message': '只有超级管理员可以创建权限'}), 403
    
    data = request.json
    name = data.get('name')
    code = data.get('code')
    type = data.get('type', 'button')
    description = data.get('description', '')
    
    if not name or not code:
        return jsonify({'code': 1, 'message': '权限名称和标识不能为空'}), 400
    
    # 检查权限标识是否已存在
    existing_perm = Permission.query.filter_by(code=code).first()
    if existing_perm:
        return jsonify({'code': 1, 'message': '权限标识已存在'}), 400
    
    try:
        # 创建新权限
        perm = Permission(
            name=name,
            code=code,
            type=type,
            description=description
        )
        db.session.add(perm)
        
        # 记录操作日志
        log = AdminLog(
            admin_id=admin.id,
            action='创建权限',
            ip=request.remote_addr,
            details=f'创建权限 {name}'
        )
        db.session.add(log)
        
        db.session.commit()
        
        return jsonify({
            'code': 0, 
            'message': '创建成功', 
            'data': {'id': perm.id}
        })
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'code': 1, 'message': f'创建失败: {str(e)}'}), 500


@admin_blueprint.route('/permissions/<int:perm_id>', methods=['PUT'])
@jwt_required()
def update_permission(perm_id):
    """更新权限"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    claims = get_jwt()
    
    # 测试账号不能更新权限
    if claims.get('is_test'):
        return jsonify({'code': 1, 'message': '测试账号不能更新权限'}), 403
    
    # 只有超级管理员可以更新权限
    if not admin.is_super:
        return jsonify({'code': 1, 'message': '只有超级管理员可以更新权限'}), 403
    
    perm = Permission.query.get(perm_id)
    if not perm:
        return jsonify({'code': 1, 'message': '权限不存在'}), 404
    
    data = request.json
    name = data.get('name')
    code = data.get('code')
    type = data.get('type')
    description = data.get('description')
    
    if not name or not code:
        return jsonify({'code': 1, 'message': '权限名称和标识不能为空'}), 400
    
    # 检查权限标识是否已存在（排除自身）
    existing_perm = Permission.query.filter(Permission.code == code, Permission.id != perm_id).first()
    if existing_perm:
        return jsonify({'code': 1, 'message': '权限标识已存在'}), 400
    
    try:
        # 更新权限信息
        perm.name = name
        perm.code = code
        if type:
            perm.type = type
        if description:
            perm.description = description
        
        # 记录操作日志
        log = AdminLog(
            admin_id=admin.id,
            action='更新权限',
            ip=request.remote_addr,
            details=f'更新权限 {name}'
        )
        db.session.add(log)
        
        db.session.commit()
        
        return jsonify({'code': 0, 'message': '更新成功'})
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'code': 1, 'message': f'更新失败: {str(e)}'}), 500


@admin_blueprint.route('/permissions/<int:perm_id>', methods=['DELETE'])
@jwt_required()
def delete_permission(perm_id):
    """删除权限"""
    current_user_id = get_jwt_identity()
    admin = Admin.query.get(current_user_id)
    claims = get_jwt()
    
    # 测试账号不能删除权限
    if claims.get('is_test'):
        return jsonify({'code': 1, 'message': '测试账号不能删除权限'}), 403
    
    # 只有超级管理员可以删除权限
    if not admin.is_super:
        return jsonify({'code': 1, 'message': '只有超级管理员可以删除权限'}), 403
    
    perm = Permission.query.get(perm_id)
    if not perm:
        return jsonify({'code': 1, 'message': '权限不存在'}), 404
    
    # 检查权限是否被角色使用
    if perm.roles.count() > 0:
        return jsonify({'code': 1, 'message': '该权限已分配给角色，不能删除'}), 400
    
    try:
        # 记录操作日志
        log = AdminLog(
            admin_id=admin.id,
            action='删除权限',
            ip=request.remote_addr,
            details=f'删除权限 {perm.name}'
        )
        db.session.add(log)
        
        # 删除权限
        db.session.delete(perm)
        db.session.commit()
        
        return jsonify({'code': 0, 'message': '删除成功'})
        
    except Exception as e:
        db.session.rollback()
        return jsonify({'code': 1, 'message': f'删除失败: {str(e)}'}), 500 